﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.SessionState;
using System.IO;
using WebAppPlanProduccion.Code;
using PlanProd.Contracts;
using Web.Framework;
using PlanProd.Contracts.Validation;
using System.Text;
using WebAppPlanProduccion.ServiceReference.PlanProdAdmin;
using System.ServiceModel;
using Web.Framework.Svc;
using PlanProd.ServiceFactory;

namespace WebAppPlanProduccion.Handler
{
    /// <summary>
    /// Summary description for FileUploadPresupuestoProdHandler
    /// </summary>
    public class FileUploadIngresoProductoHandler : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            string response = "Archivo Procesado Correctamente";
            string filePath = string.Empty;
            List<string> parseErrors = new List<string>();
            try
            {
                string fileName = Path.GetFileName(context.Request.Files[0].FileName);
                string tmpPath = HttpContext.Current.Server.MapPath("/Tmp");
                fileName = fileName + Guid.NewGuid().ToString();
                filePath = Path.Combine(tmpPath, fileName);
                context.Request.Files[0].SaveAs(filePath);

                WebServiceHelper webServiceHelper = new Code.WebServiceHelper();
                webServiceHelper.ServiceOptionsDefault = new ServiceOptions();
                webServiceHelper.ServiceOptionsDefault.UserName = Convert.ToString(context.User.Identity.Name);

                List<IngresoDeProducto> ingresoDeProductos = ExcelHelper.GetIngresoDeProductosFromExcel(filePath, parseErrors);

                ingresoDeProductos.ForEach(i => { i.EmpresaId = BaseWebPage.CompanyId; });

                List<string> ingresoDeProductosInValidados = new List<string>();
                if (parseErrors.Count > 0)
                {
                    response = BuildErrorResponse(parseErrors, ingresoDeProductosInValidados);
                }
                else
                {
                    PlanProd.Contracts.IPlanProdAdmin planAdminService = ServiceFactory.GetPlanProdAdminService();
                    ingresoDeProductosInValidados.AddRange(planAdminService.GuardarIngresoDeProductosMasivo(webServiceHelper.ServiceOptionsDefault, ingresoDeProductos));

                    response = BuildErrorResponse(parseErrors, ingresoDeProductosInValidados);
                }

            }
            catch (FaultException<WebFrameworkFaultException> ex)
            {
                response = ex.Detail.Message;
                ExceptionManager.Instance.HandleException(ex);
            }
            catch (Exception ex)
            {
                response = ex.Message;
                ExceptionManager.Instance.HandleException(ex);
            }
            finally
            {
                if (File.Exists(filePath))
                {
                    File.Delete(filePath);
                }
            }

            context.Response.ClearContent();
            context.Response.Write(response);
        }

        private static string BuildErrorResponse(List<string> parseErrors, List<string> ingresoDeProductosInValidados)
        {
            string response = string.Empty;
            StringBuilder builder = new StringBuilder();
            if (parseErrors.Count > 0 || ingresoDeProductosInValidados.Count > 0)
            {
                foreach (string errorParseo in parseErrors)
                {
                    builder.AppendLine(errorParseo);
                }

                if (ingresoDeProductosInValidados.Count > 0)
                {
                    builder.AppendLine("Los siguientes valores no existen en la base de datos:");
                    foreach (string errorNoExistencia in ingresoDeProductosInValidados)
                    {

                        builder.AppendLine(errorNoExistencia);
                    }
                }

                response = builder.ToString();
            }
            else
            {
                response = "Archivo procesado correctamente";                      
            }

            return response;
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}